package main;

import java.io.*;
import java.util.Enumeration;
import java.util.Vector;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;

class FileSystemModel implements TreeModel {
    
  private String root; // The root identifier
  private Vector listeners; // Declare the listeners vector

  public FileSystemModel() {
      this( System.getProperty( "user.home" ) );      
      listeners = new Vector();
  }
  
  public FileSystemModel( String startPath ) {
        root = startPath;
        listeners = new Vector();
    }

  public Object getRoot() {
    return (new File(root));
  }
  
  public Object getChild( Object parent, int index ) {
        File directory = (File)parent;
        String[] children = directory.list();
        return new File( directory, children[index] );
    }

    public int getChildCount( Object parent ) {
        File fileSysEntity = (File)parent;
        if ( fileSysEntity.isDirectory() ) {
            String[] children = fileSysEntity.list();
            return children.length;
        }
        else {
            return 0;
        }
    }
 
  public int getIndexOfChild( Object parent, Object child ) {
        File directory = (File)parent;
        File fileSysEntity = (File)child;
        String[] children = directory.list();
        int result = -1;

        for ( int i = 0; i < children.length; ++i ) {
            if ( fileSysEntity.getName().equals( children[i] ) ) {
                result = i;
                break;
            }
        }

        return result;
    }

  public boolean isLeaf(Object node) {
    return ((File) node).isFile();
  }

  public void addTreeModelListener(TreeModelListener l) {
    if (l != null && !listeners.contains(l)) {
      listeners.addElement(l);
    }
  }

  public void removeTreeModelListener(TreeModelListener l) {
    if (l != null) {
      listeners.removeElement(l);
    }
  }

  public void valueForPathChanged(TreePath path, Object newValue) {
     
    // Does Nothing!
  }

  public void fireTreeNodesInserted(TreeModelEvent e) {
    Enumeration listenerCount = listeners.elements();
    while (listenerCount.hasMoreElements()) {
      TreeModelListener listener = (TreeModelListener) listenerCount.nextElement();
      listener.treeNodesInserted(e);
    }
  }

  public void fireTreeNodesRemoved(TreeModelEvent e) {
    Enumeration listenerCount = listeners.elements();
    while (listenerCount.hasMoreElements()) {
      TreeModelListener listener = (TreeModelListener) listenerCount.nextElement();
      listener.treeNodesRemoved(e);
    }

  }

  public void fireTreeNodesChanged(TreeModelEvent e) {
    Enumeration listenerCount = listeners.elements();
    while (listenerCount.hasMoreElements()) {
      TreeModelListener listener = (TreeModelListener) listenerCount.nextElement();
      listener.treeNodesChanged(e);
    }

  }

  public void fireTreeStructureChanged(TreeModelEvent e) {
    Enumeration listenerCount = listeners.elements();
    while (listenerCount.hasMoreElements()) {
      TreeModelListener listener = (TreeModelListener) listenerCount.nextElement();
      listener.treeStructureChanged(e);
    }

  }
 
}